home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #334 (1994-06)(Rhein-Sieg-Soft).zip / Franz PD Disk #334 (1994-06)(Rhein-Sieg-Soft).adf / ASo-Tools / Sources / Chunks.asm < prev    next >
Assembly Source File  |  1994-03-30  |  4KB  |  193 lines

  1. * Chunks.asm
  2. * Listet die Chunks einer IFF-Datei auf. Ignoriert die Struktur, da ohne
  3. * iffparse.library gearbeitet wird.
  4. * nur für CLI.
  5. * benötigt OS2
  6.  
  7.     NOLIST
  8.     INCLUDE "dos/LVO.i"
  9.     INCLUDE "exec/LVO.i"
  10.     INCLUDE "dos/dos.i"
  11.     LIST
  12.  
  13. ;Register-Variablen:
  14.  
  15. _DOSBase:    equr a5
  16. FH:        equr d7
  17. RDArgs:     equr d6
  18. NextNamePtr:    equr a4
  19. ThisName:    equr d5
  20. FileRest:    equr d4 ;noch zu bearbeitender Teil des Files (Bytes)
  21.  
  22. ;*********************************************************************
  23.  
  24.     SECTION prg,CODE
  25.  
  26. ;Dos-Library öffnen:
  27. _main:    OPENLIB DOSName(pc),36
  28.     tst.l    d0
  29.     beq    wrongdos
  30.     move.l    d0,_DOSBase
  31. ; Parameter abfragen
  32.     lea    Template(pc),a0
  33.     move.l    a0,d1
  34.     clr.l    -(sp)
  35.     move.l    sp,d2
  36.     moveq    #0,d3
  37.     CALLDOS ReadArgs
  38.     move.l    (sp)+,NextNamePtr
  39.     move.l    d0,RDArgs
  40.     beq    CloseDos
  41.     move.l    NextNamePtr,d0 ;tst.l NextNamePtr
  42.     beq    NoMoreArgs
  43.  
  44. NextIFFFile:
  45.     move.l    (NextNamePtr)+,ThisName
  46.     beq    NoMoreArgs
  47.     move.l    ThisName,d1
  48.     move.l    #MODE_OLDFILE,d2
  49.     CALL    Open
  50.     move.l    d1,FH
  51.     bne    1$
  52. ; Fehler: Datei läßt sich nicht öffnen
  53.     lea    Error1(pc),a0
  54.     move.l    a0,d1
  55.     move.l    ThisName,-(sp)
  56.     move.l    sp,d2
  57.     CALL    VPrintf
  58.     addq.l    #4,sp
  59.     bra    NextIFFFile
  60. 1$:    move.l    FH,d1
  61.     moveq    #12,d3
  62.     sub.l    d3,sp
  63.     move.l    sp,d2
  64.     CALL    Read        ;Kopf lesen
  65.     cmp.l    d3,d0
  66.     beq    l1        ;ein IFF-File kann nicht
  67.                 ;kürzer als 12 Bytes sein
  68.     add.l    d3,sp
  69. ;kein IFF-File
  70. IFFError: lea    Error2(pc),a0
  71. FileError:
  72.     move.l    a0,d1
  73.     move.l    ThisName,-(sp)
  74.     move.l    sp,d2
  75.     CALL    VPrintf
  76.     addq.l    #4,sp
  77. EndOfIFF:
  78.     move.l    FH,d1
  79.     CALL    Close
  80.     bra    NextIFFFile
  81. l1:    cmp.l    #'FORM',(sp)+
  82.     beq    4$
  83.     addq.l    #8,sp
  84.     bra    IFFError
  85. ;die Datei ist ein IFF-File
  86. 4$:    move.l    ThisName,-(sp)
  87.     lea    HeadTxt1(pc),a0
  88.     move.l    a0,d1
  89.     move.l    sp,d2
  90.     CALL    VPrintf
  91.     addq.l    #4,sp
  92.     move.l    (sp)+,FileRest
  93.     subq.l    #4,FileRest    ;die Format-Kennung
  94.     move.l    (sp)+,d0
  95.     bsr    ChunkIDOut
  96.     lea    HeadTxt2(pc),a0
  97.     move.l    a0,d1
  98.     CALL    PutStr
  99.  
  100. ;Schleife über die Chunks:
  101. ChunkLoop:
  102.     move.l    FH,d1
  103.     moveq    #8,d3
  104.     sub.l    d3,sp
  105.     move.l    sp,d2
  106.     CALL    Read
  107.     cmp.l    d3,d0
  108.     beq    l2
  109. ;Lesefehler (zumindest nach IFF-Protokoll)
  110.     add.l    d3,sp
  111. ReadError:
  112.     lea    Error3(pc),a0
  113.     bra    FileError
  114. l2:    move.l    (sp)+,d0
  115.     bsr    ChunkIDOut
  116.     lea    ChunkTxt(pc),a0
  117.     move.l    a0,d1
  118.     move.l    sp,d2
  119.     CALL    VPrintf
  120.     move.l    (sp)+,d2
  121. ;Rest des Chunks überspringen:
  122.     move.l    FH,d1
  123.     addq.l    #1,d2
  124.     and.w    #$fffe,d2        ;auf gerade Anzahl aufrunden
  125.     sub.l    d2,FileRest
  126.     subq.l    #8,FileRest        ;die Chunk-Kennung & -Länge
  127.     beq    EndOfIFF
  128.     move.l    #OFFSET_CURRENT,d3
  129.     CALL    Seek
  130.     bra    ChunkLoop
  131.  
  132. NoMoreArgs:
  133.     move.l    RDArgs,d1
  134.     CALL    FreeArgs
  135. CloseDos:
  136.     CLOSELIB _DOSBase
  137. nodos:    moveq    #0,d0
  138.     rts
  139.  
  140. ;keine dos-library V36+
  141. wrongdos:
  142.     OPENLIB DOSName(pc),33
  143.     tst.l    d0
  144.     beq    nodos
  145.     move.l    d0,_DOSBase
  146.     CALLDOS Output
  147.     move.l    d0,d1
  148.     beq    CloseDos
  149.     lea    DOSName(pc),a0
  150.     move.l    a0,d2
  151.     move.l    #DOS36Len,d3
  152.     CALL    Write
  153.     bra    CloseDos
  154.  
  155. ; Unterroutine: Chunk-ID ausgeben:
  156. ChunkIDOut:
  157.     move.w    d0,-(sp)
  158.     moveq    #0,d1
  159.     move.b    (sp),d0
  160.     move.b    d1,(sp)
  161.     move.w    d0,-(sp)
  162.     move.b    d1,(sp)
  163.     swap    d0
  164.     move.w    d0,-(sp)
  165.     move.b    (sp),d0
  166.     move.b    d1,(sp)
  167.     move.w    d0,-(sp)
  168.     move.b    d1,(sp)
  169.     lea    IDFormat(pc),a0
  170.     move.l    a0,d1
  171.     move.l    sp,d2
  172.     CALL    VPrintf
  173.     addq.l    #8,sp
  174.     rts
  175.  
  176. ;*********************************************************************
  177.  
  178. DOSName:    DOSNAME
  179.         dc.b    " v36+ required",10
  180. DOS36Len:    equ    *-DOSName
  181. Template:    dc.b    "Files/A/M",0
  182.  
  183. HeadTxt1:    dc.b "IFF-File %s, Length %ld+8 Bytes. Format: ",0
  184. HeadTxt2:    dc.b 10,"Chunk",9,"Length (-8) in Bytes",10,0
  185. ChunkTxt:    dc.b 9,"%ld",10,0
  186. Error1:     dc.b "File %s not found",10,0
  187. Error2:     dc.b "%s is no IFF-File",10,0
  188. Error3:     dc.b "Read-Error (early EOF)",10,0
  189. IDFormat:    dc.b "%c%c%c%c",0
  190.  
  191.     END
  192.  
  193.